/**
 * @param {number[]} nums
 * @return {number[][]}
 */
 var threeSum = function(nums) {
    // let path = []
    // nums.sort()
    // res = []
    // let used = new Array(nums.length).fill(false);
    // const back = function(path,index){
    //     //出口
    //     if(path.length == 3){
    //         if((path[0]+path[1]+path[2])==0){
    //             let x = []
    //             path.forEach((v)=>{
    //                x.push(v)
    //             })
    //             res.push(x)
    //         }        
    //         return
    //     }
    //     for(let i = index;i<nums.length;i++){
    //         if ( (i>0&& nums[i] === nums[i - 1] && !used[i - 1])) continue;
    //         path.push(nums[i])
    //         used[i] = true;
    //         back(path,i+1)
    //         path.pop()
    //         used[i] = false;
    //     }
    // }
    // back(path,0)
    // return res; 超时
    nums.sort((a, b) => a - b);//注意
    let res = []    
    for(let i = 0;i<nums.length;i++){
        if(nums[i]>0) break
        if(i>0&&nums[i]==nums[i-1])continue //去重
        let [l,r] = [i+1,nums.length-1]
        while(l<r){
            let sum = nums[l]+nums[r]+nums[i]
            if(sum==0) {
                res.push([nums[i],nums[l],nums[r]])
                while(l<r&&nums[l] == nums[l+1]){
                    l++
                }
                while(l<r&&nums[r] == nums[r-1]){
                    r--
                }
                l++
                r--
            }
            if(sum>0){
                r--
            }
            if(sum<0){
                l++
            }
        }      
    }
    return res

};
debugger
threeSum([-1,0,1,2,-1,-4,-2,-3,3,0,4])